export class DepartmentTreeFilter {
    private originalData: any;
    private filteredData: any[];
    private filteredDataIds: any[];

    constructor(departments) {
        this.originalData = JSON.parse(JSON.stringify(departments));
        this.filteredData = [];
    }

    /**
     * 根据post值过滤部门树
     * @param {Array} postValues - 需要匹配的post值数组
     * @returns {Array} 过滤后的部门树
     */
    filterByPost(postValues) {
        if (!postValues || postValues.length === 0) {
            return this.originalData;
        }

        this.filteredData = this._filterTree(this.originalData, postValues);
        return this.filteredData;
    }

    /**
     * 递归过滤部门树
     * @param {Array} nodes - 当前层级的部门节点
     * @param {Array} postValues - 需要匹配的post值数组
     * @returns {Array} 过滤后的节点数组
     */
    _filterTree(nodes, postValues) {
        const filteredNodes = [];

        for (const node of nodes) {
            // 深拷贝当前节点
            const newNode = {...node};

            // 递归过滤子节点
            if (newNode.children && newNode.children.length > 0) {
                newNode.children = this._filterTree(newNode.children, postValues);
            }

            // 检查当前节点或子节点是否匹配
            const nodeMatches = postValues.some(row => row == newNode.post);
            const childrenMatch = newNode.children && newNode.children.length > 0;

            // 如果当前节点匹配，或者子节点有匹配的，则保留该节点
            if (nodeMatches || childrenMatch) {
                filteredNodes.push(newNode);
            }
        }

        return filteredNodes;
    }

    /**
     * 获取过滤后的部门树
     * @returns {Array} 过滤后的部门树
     */
    getFilteredTree() {
        return this.filteredData;
    }

    /**
     * 重置为原始数据
     */
    reset() {
        this.filteredData = JSON.parse(JSON.stringify(this.originalData));
    }

    traverse(node:any[], key:string) {
        if (node[key]) {
            this.filteredDataIds.push(node[key]);
        }
        if (node.children && node.children.length > 0) {
            node.children.forEach(child => this.traverse(child, key));
        }
    }

    getFilteredDataIds(key:string) {

        this.filteredDataIds = []

        // 也可以通过下面的flattenTree()
        this.filteredData.forEach(rootNode => this.traverse(rootNode, key));

        return this.filteredDataIds;
    }


    /**
     * 获取部门树的扁平化列表（用于展示）
     * @param {Array} tree - 部门树
     * @param {number} level - 当前层级
     * @returns {Array} 扁平化的部门列表
     */
    flattenTree(tree = this.filteredData, level = 0) {
        let result = [];

        for (const node of tree) {
            result.push({
                id: node.id,
                name: node.name,
                post: node.post,
                parent_id: node.parent_id,
                level: level,
                hasChildren: node.children && node.children.length > 0
            });

            if (node.children && node.children.length > 0) {
                result = result.concat(this.flattenTree(node.children, level + 1));
            }
        }

        return result;
    }

    /**
     * 统计过滤结果
     * @returns {Object} 统计信息
     */
    getStatistics() {
        const flatList = this.flattenTree(this.filteredData);
        const total = flatList.length;
        const topLevel = flatList.filter(item => item.level === 0).length;
        const subDepartments = flatList.filter(item => item.level > 0).length;

        return {
            total,
            topLevel,
            subDepartments,
            postDistribution: this._getPostDistribution(flatList)
        };
    }

    /**
     * 获取post值分布
     * @param {Array} flatList - 扁平化的部门列表
     * @returns {Object} post值分布
     */
    _getPostDistribution(flatList) {
        const distribution = {};
        flatList.forEach(item => {
            distribution[item.post] = (distribution[item.post] || 0) + 1;
        });
        return distribution;
    }
}

// 使用示例和测试代码
// function testDepartmentFilter() {
//     // 测试数据
//     const testData = [
//         {
//             "biz_id": 2116,
//             "status": 1,
//             "parent_id": 0,
//             "post": 1,
//             "id": 8919,
//             "name": "咨询部",
//             "parent": "顶级",
//             "children": [
//                 {
//                     "biz_id": 2116,
//                     "status": 1,
//                     "parent_id": 8919,
//                     "post": 1,
//                     "id": 8920,
//                     "name": "咨询一部",
//                     "parent": "咨询部",
//                     "children": []
//                 },
//                 {
//                     "biz_id": 2116,
//                     "status": 1,
//                     "parent_id": 8919,
//                     "post": 2,
//                     "id": 8925,
//                     "name": "咨询二部",
//                     "parent": "咨询部",
//                     "children": []
//                 }
//             ]
//         },
//         {
//             "biz_id": 2116,
//             "status": 1,
//             "parent_id": 0,
//             "post": 4,
//             "id": 8921,
//             "name": "推广部",
//             "parent": "顶级",
//             "children": [
//                 {
//                     "biz_id": 2116,
//                     "status": 1,
//                     "parent_id": 8921,
//                     "post": 4,
//                     "id": 8922,
//                     "name": "推广一部",
//                     "parent": "推广部",
//                     "children": []
//                 }
//             ]
//         },
//         {
//             "biz_id": 2116,
//             "status": 1,
//             "parent_id": 0,
//             "post": 2,
//             "id": 8923,
//             "name": "售中部",
//             "parent": "顶级",
//             "children": [
//                 {
//                     "biz_id": 2116,
//                     "status": 1,
//                     "parent_id": 8923,
//                     "post": 2,
//                     "id": 8924,
//                     "name": "售中一部",
//                     "parent": "售中部",
//                     "children": []
//                 }
//             ]
//         },
//         {
//             "biz_id": 2116,
//             "status": 1,
//             "parent_id": 0,
//             "post": 0,
//             "id": 8913,
//             "name": "总部",
//             "parent": "顶级",
//             "children": []
//         }
//     ];
//
//     // 创建过滤器实例
//     const filter = new DepartmentTreeFilter(testData);
//
//     // 测试过滤功能
//     console.log('=== 原始数据 ===');
//     console.log(JSON.stringify(testData, null, 2);
//
//     // 过滤post值为1和2的部门
//     const postValuesToFilter = [1, 2];
//     const filteredTree = filter.filterByPost(postValuesToFilter);
//
//     console.log(`\n=== 过滤条件: post in [${postValuesToFilter}] ===`);
//     console.log(JSON.stringify(filteredTree, null, 2);
//
//     // 获取统计信息
//     const stats = filter.getStatistics();
//     console.log('\n=== 统计信息 ===');
//     console.log(stats);
//
//     // 获取扁平化列表
//     const flatList = filter.flattenTree();
//     console.log('\n=== 扁平化列表 ===');
//     console.log(flatList);
//
//     return {
//         filter,
//         filteredTree,
//         stats,
//         flatList
//     };
// }

// // 如果直接运行此文件，则执行测试
// if (typeof require !== 'undefined' && require.main === module) {
//     testDepartmentFilter();
// }

// 导出供其他模块使用
// if (typeof module !== 'undefined' && module.exports) {
//     module.exports = DepartmentTreeFilter;
// }
